home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Sample Code / Snippets / Devices / Floppy II / FloppytestII.c next >
Encoding:
C/C++ Source or Header  |  1992-07-15  |  3.8 KB  |  147 lines  |  [TEXT/MPS ]

  1. #include    <Events.h>
  2. #include    <Devices.h>
  3. #include    <Memory.h>
  4. #include    <Types.h>
  5. #include    <SysEqu.h>
  6. #include    <StdIO.h>
  7.  
  8. #define kHandleBased        0x0040    
  9. #define UnitToRef(unitNo)        ( -(unitNo) - 1 )
  10.  
  11. typedef struct
  12. {
  13.     short        drvrFlags;        /* dReadEnable, etc */
  14.     short        drvrDelay;        /* for periodic actions via SystemTask */
  15.     short        drvrEMask;        /* for desk acc only */
  16.     short        drvrMenu;        /* for desk acc only */
  17.     short        drvrOpen;        /* offset to open routine */
  18.     short        drvrPrime;        /* offset to prime routine */
  19.     short        drvrCtl;        /* offset to control routine */
  20.     short        drvrStatus;        /* offset to status routine */
  21.     short        drvrClose;        /* offset to close routine */
  22.     unsigned char drvrName[];    /* Pascal string */
  23. } DriverHeader;
  24.  
  25. typedef struct
  26. {
  27.     long        diskCapInBlocks;
  28.     char        numSides;
  29.     char        numSectors;
  30.     short        numTracks;
  31. } formatblock;
  32.  
  33. short FindDriverByName( void *pString )
  34. {
  35.     short            refNo;
  36.     Byte            oldDriverFlags;
  37.     DCtlHandle        driverInfo;
  38.     DriverHeader    *driverPtr, **driverHandle;
  39.     short            unitNumber;
  40.     short            numEntriesInTable;
  41.     
  42.     numEntriesInTable = *( (short*)UnitNtryCnt );
  43.     
  44.     for ( unitNumber=0; unitNumber<numEntriesInTable; unitNumber++ ) {
  45.         refNo = UnitToRef(unitNumber);
  46.         driverInfo = GetDCtlEntry(refNo);
  47.         if (driverInfo) {
  48.             if ((**driverInfo).dCtlFlags & kHandleBased ) {
  49.                 driverHandle = (void *)(**driverInfo).dCtlDriver;
  50.                 if (!driverHandle || !(*driverHandle))
  51.                     continue;
  52.                     
  53.                 oldDriverFlags = HGetState((Handle) driverHandle);
  54.                 HLock((Handle)driverHandle);
  55.                 
  56.                 if (EqualString(pString, (**driverHandle).drvrName, false, true)) {
  57.                     HSetState((Handle)driverHandle, oldDriverFlags);
  58.                     return(refNo);
  59.                     }
  60.                 
  61.                 HSetState((Handle)driverHandle, oldDriverFlags);
  62.                 }
  63.                 else {
  64.                 driverPtr = (void*)(**driverInfo).dCtlDriver;
  65.                 if ( !driverPtr ) 
  66.                     continue;
  67.                     
  68.                 if ( EqualString( pString, driverPtr->drvrName, false, true ) )
  69.                     return( refNo );
  70.                 }
  71.             }
  72.         }
  73.     
  74.     return(0);
  75. }
  76.  
  77. void main()
  78. {
  79.     ParmBlkPtr        pBlockPtr;
  80.     OSErr            err;
  81.     short            refNum;
  82.     formatblock        formatList[40];
  83.     short            i;
  84.     Boolean            Cap, TSSData, numSide, numSec, numTrak, SD;
  85.     long            address;
  86.     
  87.     refNum = FindDriverByName("\p.Sony");
  88.     
  89.     pBlockPtr = (ParmBlkPtr) NewPtrClear (sizeof (ParamBlockRec));
  90.     if (MemError() != noErr)
  91.         Debugger();
  92.         
  93.     pBlockPtr->cntrlParam.ioCompletion = nil;
  94.     pBlockPtr->cntrlParam.ioResult = 0;
  95.     pBlockPtr->cntrlParam.ioVRefNum = 1;
  96.     pBlockPtr->cntrlParam.ioCRefNum = refNum;
  97.     pBlockPtr->cntrlParam.csCode = 6;
  98.     pBlockPtr->cntrlParam.csParam[0] = 5;
  99.     address = &formatList;
  100.     pBlockPtr->cntrlParam.csParam[1] = (address >> 16);
  101.     pBlockPtr->cntrlParam.csParam[2] = &formatList;
  102.     
  103.     err = PBStatus (pBlockPtr, false);
  104.     if (err != noErr)
  105.         DebugStr("\perror in PBStatus");
  106.         
  107.     for (i = 0; i <= pBlockPtr->cntrlParam.csParam[0]; ++i) {
  108.         Cap = (formatList[i].diskCapInBlocks == 1440);
  109.         TSSData = ((formatList[i].numSides & 0x80) >> 4);
  110.         SD = ((formatList[i].numSides & 0x10) == 0);
  111.         numSide = ((formatList[i].numSides & 0xF) == 2);
  112.         numSec = (formatList[i].numSectors == 9);
  113.         numTrak = (formatList[i].numTracks == 80);
  114.         
  115.         if (Cap && TSSData && SD && numSide && numSec && numTrak) {
  116.             printf ("the index I want is %i\n", i);
  117.             break;
  118.             }
  119.         if (i == pBlockPtr->cntrlParam.csParam[0])
  120.             printf ("No Such Drive Format at index %i\n", i++);
  121.         }
  122.         
  123.     DisposPtr ((Ptr) pBlockPtr);
  124.     
  125.     if (i <= pBlockPtr->cntrlParam.csParam[0]) {
  126.         
  127.         pBlockPtr = (ParmBlkPtr) NewPtrClear (sizeof (ParamBlockRec));
  128.         if (MemError() != noErr)
  129.             Debugger();
  130.  
  131.         pBlockPtr->cntrlParam.ioCompletion = nil;
  132.         pBlockPtr->cntrlParam.ioResult = 0;
  133.         pBlockPtr->cntrlParam.ioVRefNum = 1;
  134.         pBlockPtr->cntrlParam.ioCRefNum = refNum;
  135.         pBlockPtr->cntrlParam.csCode = 6;
  136.         pBlockPtr->cntrlParam.csParam[0] = i;
  137.     
  138.         err = PBControl (pBlockPtr, false);
  139.         if (err != noErr)
  140.             DebugStr("\perror in PBControl");
  141.         
  142.         DisposPtr ((Ptr) pBlockPtr);
  143.         }
  144.  
  145.     return;
  146. }
  147.